package com.cskaoyan.javase._2inner._2static._1basic;

/**
 * 先明确两点:
 *      1.静态内部类和外围类是"好兄弟",互相访问不受权限限制.
 *      2.静态内部类和外围类相对独立,创建对象不会互相影响.
 *          思考:
 *          a.静态内部类中的成员方法中,存在几个对象?
 *          只有一个对象,就是静态内部类自身对象
 *          这里如果想要访问外围类,需要创建外围类对象,怎么创建?
 *          直接new创建
 *
 *          b.静态内部类中的静态成员方法中,存在几个对象?
 *          没有对象,想访问什么,就创建什么对象,没有限制,都是new直接创建
 *
 *          c.外围类中的成员方法中,存在几个对象?
 *          只有一个对象,就是外围类自身对象
 *          这里如果想要访问静态内部类,需要创建静态内部类对象,怎么创建?
 *          直接new创建
 *
 *          c.外围类中的静态成员方法中,存在几个对象?
 *          没有对象,想访问什么,就创建什么对象,没有限制,都是new直接创建
 *
 *
 *静态内部类的访问特点，主要从以下几个角度研究：
 *      1.静态内部类内部访问外围类
 *          反正在哪里都没有外围类对象,都需要创建它的对象再访问.
 *
 *      2.外围类访问静态内部类成员
 *          反正在哪里都没有静态内部类对象,都需要创建它的对象再访问.
 *
 *      3.外部类访问静态内部类成员
 *          整个访问过程,都受访问权限限制
 *          但是注意和成员内部类不同的是:
 *              无需创建外围类对象,而是直接创建静态内部类对象
 *
 *
 *      4.静态内部类访问外部类成员
 *          可以访问,创建对象访问,受权限限制.
 *
 * @since 09:37
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 要想在外部类中创建静态内部类对象,
        // 需要明确指出该静态内部类属于哪个外围类,但是一定要记住,并不需要创建外围类对象
        EnclosedClazz.NestedClazz nc = new EnclosedClazz.NestedClazz();
        System.out.println(nc.a);
        // System.out.println(nc.b);
        EnclosedClazz.A a = new EnclosedClazz().new A();
    }
}

class EnclosedClazz {
    int a;
    private int b = 10;
    static int c = 20;
    static final int D = 30;

    class A{}

    public void test(){
        NestedClazz nc = new NestedClazz();
        System.out.println(nc.a);
        System.out.println(nc.b);
    }

    // 静态内部类
    static class NestedClazz {
        int a;
        private int b = 10;
        static int c = 20;
        static final int D = 30;

        public void test() {
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);
        }

        public static void testStatic() {
            EnclosedClazz ec = new EnclosedClazz();
            System.out.println(ec.a);
            System.out.println(ec.b);
        }
    }
}